Efficient modular addition resistant to side channel attacks

ABSTRACT

A cryptographic device performs modular addition between a first integer value x and a second integer value y in a processor by: obtaining a first masked input {circumflex over (x)}, a second masked input ŷ, a first mask r x  and a second mask r y , the first masked input {circumflex over (x)} resulting from the first integer value x masked by the first mask r x  and the second masked input ŷ resulting from the second integer value y masked by the second mask r y ; computing a first iteration masked carry value ĉ 1 , using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r x , the second mask r y  and a carry mask value λ; recursively updating the masked carry value ĉ i  to obtain a final masked carry value ĉ k−1 , wherein the masked carry value is updated using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r x , the second mask r y , and the carry mask value λ; combining the first masked input {circumflex over (x)} and the second masked input ŷ and the final masked value ĉ k−1  to obtain an intermediate value; combining the intermediate value with the carry mask value to obtain a masked result; and outputting the masked result and a combination of the first mask r x  and the second mask r y . It is preferred that the combinations use XOR.

TECHNICAL FIELD

The present principles relate generally to cryptography and in particular to a modular addition algorithm secure against Differential Power Analysis (DPA) attacks.

BACKGROUND

This section is intended to introduce the reader to various aspects of art, which may be related to various aspects of the present principles that are described and/or claimed below. This discussion is believed to be helpful in providing the reader with background information to facilitate a better understanding of the various aspects of the present principles. Accordingly, it should be understood that these statements are to be read in this light, and not as admissions of prior art.

Modular addition is used in many cryptographic implementations. A well-known constant-time addition algorithm is the following, where ⊕ is a bitwise XOR operation and

a bitwise AND operation.

Algorithm 1 Adder algorithm (constant-time) Input: two k-bit operands (x, y) Output: A = x + y mod 2^(k) /* Initialization */ 1: A ← x ⊕ y 2: B ← x 

 y 3: C ← 0 /* Main loop */ 4: for i = 1 to k − 1 do 5: C ← C 

 A 6: C ← C ⊕ B 7: C ← 2C 8: end for /* Aggregation */ 9: A ← A ⊕ C 10: return A

With this algorithm, the carry c_(i) computed in step i using the register C is recursively defined as

$c_{i} = \left\{ \begin{matrix} {0,} & {{{for}\mspace{14mu} i} = 0} \\ {{2\left\lbrack {c_{i - 1}{\left( {x \oplus y} \right) \oplus \left( {xy} \right)}} \right\rbrack},} & {{{for}\mspace{14mu} 1} \leq i \leq {k - 1}} \end{matrix} \right.$

Once the last carry c_(k−1) has been computed, the addition result is obtained as

x+y=x⊕y⊕c _(k−1).

It will be appreciated that Algorithm 1 in some cases can be attacked using Differential Power Analysis (DPA) and related attacks introduced by Kocher et al. [see Paul Kocher, Joshua Jaffe, and Benjamin Jun. Differential power analysis. In M. Wiener, editor, Advances in Cryptology—CRYPTO'99, volume 1666 of Lecture Notes in Computer Science, pages 388-397. Springer-Verlag, 1999.]. Such attacks exploit side-channel leakage to uncover secret information. During the execution of a cryptographic algorithm, the secret key or some related information may be revealed by monitoring the power consumption of the electronic device executing the cryptographic algorithm. DPA-type attacks potentially apply to all cryptosystems, including popular block-ciphers like DES or AES.

The commonly suggested way to thwart DPA-type attacks for implementations of block-ciphers is random masking. The idea is to blind sensitive data with a random mask at the beginning of the algorithm. The algorithm is then executed as usual. Of course, at some step within a round the value of the mask (or a value derived thereof) must be known in order to correct the corresponding output value.

For cryptographic algorithms involving different types of operations, two masking techniques usually have to be used: a Boolean masking (generally by applying an XOR) and an arithmetic masking (by applying an +). Furthermore, it is useful to have efficient and secure methods for switching from Boolean masking to arithmetic masking, and conversely.

Two secure algorithms were proposed by Goubin [see Louis Goubin. A sound method for switching between Boolean and arithmetic masking. In ç. K. Koç, D. Naccache, and C. Paar, editors, Cryptographic Hardware and Embedded Systems—CHES 2001, volume 2162 of Lecture Notes in Computer Science, pages 3-15. Springer-Verlag, 2001.]. Each algorithm work in one direction: the first converts from Boolean to arithmetic and the second from arithmetic to Boolean. The secure Arithmetic-to-Boolean conversion is however less efficient than the secure Boolean-to-Arithmetic conversion. The cost of the latter depends on the length of the masked operands that is 5·k+5 operations, where k is the length of the operands. Thus, typically 5·32+5=165 operations are required for 32-bit inputs.

Generally expressed, the masking problem for modular addition, can be stated as how to securely compute the addition of k-bit operands x and y from Boolean masked inputs ({circumflex over (x)}, ŷ) while the k-bit result is still Boolean masked. A modular addition is a carried out with classical switching methods in three steps:

-   -   1. Convert first the Boolean masked inputs {circumflex over         (x)}=x⊕r_(x) and ŷ=y⊕r_(y) to arithmetic masked inputs         A_(x)=x−r_(x) and A_(y)=y−r_(y) using Boolean-to-Arithmetic         conversion algorithm. This operation is efficient and takes 7         elementary operations (see Goubin's paper) for each conversion.     -   2. Perform two separate additions, one with the masked data and         the other with the masks (A_(x)+A_(y)=x−r_(x)+y−r_(y),         r_(x)+r_(y)). This costs 2 operations; and     -   3. Convert the addition result of masked data back to a Boolean         masked output {circumflex over (z)}=(x+y)⊕(T_(x)+r_(y)) using an         Arithmetic-to-Boolean conversion algorithm.

The overall computation cost for one secure addition is then 5 k+5+2·7+2=5 k+21 operations using Goubin's conversion methods. A typical cost for one secure addition is thus 5·32+21=181 operations for 32-bit inputs.

To make Algorithm 1 masked, it must be ensured that the computations do not leak information about x, y or the carry c_(i). It is easily seen that the carry c_(i) is a function of x and y. Thus, if the carry is not masked, it would leak information about x and y and this information could be used by an attacker to launch a side-channel attack (such as DPA). In his Arithmetic-to-Boolean conversion algorithm, Goubin proposed to blind the carry value using a random λ as ĉ_(i−1)=c_(i−1)⊕2λ. This idea can be applied to Algorithm 1, which gives the following constant-time algorithm.

Algorithm 2 Adder algorithm (with blinded carry) Input: (x, y) ∈ 

 ₂ _(k) × 

 ₂ _(k) Output: x + y (mod 2^(k)) /* Initialization */ 1: A ← x ⊕ y 2: B ← x 

 y 3: C ← λ /* Ω = λ ⊕ (x 

 y) ⊕ 2 λ 

 (x ⊕ y) */ 4: B ← B ⊕ C 5: C ← 2C 6: Ω ← C 

 A 7: Ω ← Ω ⊕ B /* Main loop */ 8: for i = 1 to k − 1 do 9: B ← B 

 A 10: B ← B ⊕ Ω 11: B ← 2B 12: end for /* Aggregation */ 13: A ← A ⊕ B 14: A ← A ⊕ C 15: return A

From an efficiency perspective, it is interesting to re-use the same mask 2λ for all the successive carries. In Algorithm 2, a mask correction value Ω should thus be computed for each round as Ω=[2λ

(x⊕y)⊕(x

y)]⊕λ. As 2λ is re-used for every iteration, the correction term Ω is the same for each iteration. This term can thus be computed once and then passed along to all iterations of the masked carry-chain calculation. The skilled person will appreciate that it is preferred to use a new random mask for each new addition to ensure the uniform distribution of masks remains between two algorithm executions.

The masked version of the carry equation is as follows:

${\hat{c}}_{i} = \left\{ \begin{matrix} {{2\; \lambda},} & {{{for}\mspace{14mu} i} = 0} \\ {{2\left\lbrack {{\hat{c}}_{i - 1}{\left( {x \oplus y} \right) \oplus \Omega}} \right\rbrack},} & {{{for}\mspace{14mu} 1} \leq i \leq {k - 1}} \end{matrix} \right.$

At the end, ĉ_(k−1)=c_(k−1)⊕2λ. Therefore, x+y can be obtained using two additional XOR operations in the Aggregation phase by calculating

x+y=x⊕y⊕c _(k−1)⊕2λ

In previous algorithm only the carry is masked. It will be appreciated that it is desired to make such an addition more efficient and work with blinded inputs x and y. In other words to have a solution that is secure and uses less operations for the addition. The present principles provide such a solution.

SUMMARY

In a first aspect, the principles are directed to a method of performing modular addition between a first integer value x and a second integer value y. A hardware processor obtains a first masked input {circumflex over (x)}, a second masked input ŷ, a first mask r_(x) and a second mask r_(y), the first masked input {circumflex over (x)} resulting from the first integer value x masked by the first mask r_(x) and the second masked input ŷ resulting from the second integer value y masked by the second mask r_(y); computes a first iteration carry value c₁, using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r_(x), the second mask r_(y); recursively updates intermediate carry values c_(i) to obtain a final carry value c_(k−1), wherein an intermediate carry value is updated using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r_(x) and the second mask r_(y); combines the first masked input {circumflex over (x)} and the second masked input ŷ and the final carry value c_(k−1) to obtain a masked result; and outputs the masked result.

In an embodiment, the first iteration carry value, the intermediate carry values and the final carry value are masked, the first iteration carry value c₁ is computed using also a carry mask value λ, and the intermediate carry values c_(i) are updated using also the carry mask value λ; and the masked result is obtained by combining the first masked input {circumflex over (x)} and the second masked input ŷ and the final masked carry value to obtain an intermediate value and combining the intermediate value with the carry mask value to obtain a masked result. It is advantageous that the intermediate value and the masked result are obtained using XOR between the combined values. It is alternatively advantageous that the method further comprises outputting a combination of the first mask r_(x) and the second mask r_(y); it is then preferred that the combination of the first mask r_(x) and the second mask r_(y) is obtained using XOR.

In a further embodiment, the modular addition is used to subtract the second integer value y from the first integer value x, the method further comprising: between the obtaining and the computing, setting the first masked input {circumflex over (x)} to the bitwise complementation of the first masked input {circumflex over (x)}; and between the combining and the outputting, setting the masked result to the bitwise complementation of the masked result.

In a second aspect, the principles are directed to a method of performing modular addition between n integer values x₁ . . . x_(n), wherein n≧3, the method comprising, in a hardware processor: obtaining n masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and n masks r₁ . . . r_(n), wherein each masked input {circumflex over (x)}_(i) results from a combination between an integer value x_(i) and a corresponding mask r_(i); generating a first intermediate couple of a masked value and a mask (A₁, R_(A1)) using masked inputs {circumflex over (x)}₁, {circumflex over (x)}₂, {circumflex over (x)}₃ and the corresponding masks r₁, r₂, r₃; generating a second intermediate couple of masked value and a mask (B₁, R_(B1)) using masked inputs {circumflex over (x)}₁, {circumflex over (x)}₂, {circumflex over (x)}₃ and the corresponding masks r₁, r₂, r₃; if n>3, performing n−3 iterations, where k is a present iteration, of: computing a k-th first intermediate couple of a masked value and a mask (A_(k), R_(Ak)), using the first intermediate couple of a masked value and a (A_(k−1), R_(Ak−1)) the second intermediate couple of a masked value and a mask (B_(k−1), R_(Bk−1)), and a masked input and a mask ({circumflex over (x)}_(k+3), r_(k+3)); and computing a k-th first intermediate couple of a masked value and a mask (B_(k), R_(Bk)), using the first intermediate couple of a masked value and a mask (A_(k−1), R_(Ak−1)) the second intermediate couple of a masked value and a mask (B_(k−1), R_(Bk−1)), and a couple of input ({circumflex over (x)}_(k+3), r_(k+3)); and performing a modular addition between the first intermediate couple value (A_(k), R_(Ak)), and the second intermediate couple values (B_(k), R_(Bk)), to obtain a masked result; and outputting the masked result.

In an embodiment, the intermediate masked values A₁, . . . , A_(k) are a combination of masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and the combinations are obtained using a XOR between the input values, and where the masks R_(A1), . . . , R_(Ak) are random or a combination of masks r₁ . . . r_(n), and where the combinations are obtained using XOR between the mask values; and the intermediate masked values B₁, . . . , B_(k) are combinations of masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and the combinations are obtained using a XOR and an AND between the input values and where the masks R_(B1), . . . , R_(Bk) are random or combinations of masks r₁ . . . r_(n), and the combinations are obtained using a XOR between the mask values.

In a third aspect, the principles are directed to a device for performing modular addition between a first integer value x and a second integer value y, the device comprising a hardware processor configured to: obtain a first masked input {circumflex over (x)}, a second masked input ŷ, a first mask r_(x) and a second mask r_(y), the first masked input {circumflex over (x)} resulting from the first integer value x masked by the first mask r_(x) and the second masked input ŷ resulting from the second integer value y masked by the second mask r_(y); compute a first iteration carry value c₁, using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r_(x), the second mask r_(y); recursively update intermediate carry values c_(i) to obtain a final carry value c_(k−1), wherein an intermediate carry value is updated using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r_(x) and the second mask r_(y); combine the first masked input {circumflex over (x)} and the second masked input ŷ and the final carry value c_(k−1) to obtain a masked result; and output the masked result.

In an embodiment, the first iteration carry value, the intermediate carry values and the final carry value are masked and the hardware processor is configured to: compute the first iteration carry value c₁ using also a carry mask value λ; and update the intermediate carry values c_(i) using also the carry mask value λ; and the hardware processor is configured to combine the first masked input {circumflex over (x)} and the second masked input ŷ and the final masked carry value to obtain an intermediate value, and to combine the intermediate value with the carry mask value to obtain the masked result. It is advantageous that the intermediate value and the hardware processor is configured to use XOR between the combined values to obtain the masked result. It is alternatively advantageous that the hardware processor is further configured to output a combination of the first mask r_(x) and the second mask r_(y).

In a further embodiment, the hardware processor is configured to use the modular addition to subtract the second integer value y from the first integer value x, and the hardware processor is further configured to: set the first masked input {circumflex over (x)} to the bitwise complementation of the first masked input {circumflex over (x)}; and set the masked result to the bitwise complementation of the masked result.

In a fourth second aspect, the principles are directed to a device for performing modular addition between n integer values x₁ . . . x_(n), wherein n≧3, the device comprising a hardware processor configured to: obtain n masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and n masks r₁ . . . r_(n), wherein each masked input {circumflex over (x)}_(i) results from a combination between an integer value x_(i) and a corresponding mask r_(i); generate a first intermediate couple of masked and mask values (A₁, R_(A1)) using masked inputs {circumflex over (x)}₁, {circumflex over (x)}₂, {circumflex over (x)}₃ and the corresponding masks r₁, r₂, r₃; generate a second intermediate couple of masked and mask values (B₁, R_(B1)) using masked inputs {circumflex over (x)}₁, {circumflex over (x)}₂, {circumflex over (x)}₃ and the corresponding masks r₁, r₂, r₃; if n>3, perform n−3 iterations, where k is a present iteration, of: computing a k-th first intermediate couple of masked and mask values (A_(k), R_(Ak)), using the first intermediate couple of masked and mask values (A_(k−1), R_(Ak−1)) the second intermediate couple of masked and mask values (B_(k−1), R_(Bk−1)), and a couple of input ({circumflex over (x)}_(k+3), r_(k+3)); and computing a k-th first intermediate couple of masked and mask values (B_(k), R_(Bk)), using the first intermediate couple of masked and mask values (A_(k−1), R_(Ak−1)) the second intermediate couple of masked and mask values (B_(k−1), R_(Bk−1)), and a couple of input ({circumflex over (x)}_(k+3), r_(k+3)); and perform a modular addition between the first intermediate couple value (A_(k), R_(Ak)), and the second intermediate couple values (B_(k), R_(Bk)) to obtain a masked result; and output the masked result.

It is advantageous that the intermediate masked values A₁, . . . , A_(k) are a combination of masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and the combinations are obtained using a XOR between the input values, and where mask values R_(A1), . . . , R_(Ak) are random or a combination of masks r₁ . . . r_(n), and where the combinations are obtained using XOR between the mask values; and the intermediate masked value B₁, . . . , B_(k) are combinations of masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and the combinations are obtained using a XOR and an AND between the input values and where the mask values R_(B1), . . . , R_(Bk) are random or combinations of masks r₁ . . . r_(n), and the combinations are obtained using a XOR between the mask values.

BRIEF DESCRIPTION OF DRAWINGS

Preferred features of the present principles will now be described, by way of non-limiting example, with reference to the accompanying drawings, in which

FIG. 1 illustrates a cryptographic device according to a preferred embodiment of the present principles; and

FIG. 2 illustrates a generalization to three or more integers.

DESCRIPTION OF EMBODIMENTS

A main idea of the present principles is to compute addition from Boolean masked inputs by implementing a secure version of the modular addition, that is an implementation where the input values of x and y and the successive values of the carry c_(i) are kept always masked and where the algorithm outputs a Boolean masked result. This approach is effective if an addition modulo 2^(k) occurs in combination with a Boolean operation (e.g. a XOR or any operation that is compatible with Boolean masking like logical Shifts and Rotations).

In the algorithm of the present principles, it is ensured that the computations do not leak information about x and y, nor about the successive carries c_(i).

Goubin's idea is followed and the carry with 2λ is masked, but a change is introduced. Indeed, it is remarked that both the first round carry c₁ and Ω can be computed from the same value Ω₀=(x

y)⊕λ. It is then proposed to reorder the operations for computing Ω. The reordering allows saving a few operations in the secure version of the algorithm.

Given that ĉ₀=2λ and the definition of Ω, the masked version of the carry equation simplifies to:

${\hat{c}}_{i} = \left\{ \begin{matrix} {{2\; \Omega_{0}},} & {{{for}\mspace{14mu} i} = 0} \\ {{2\left\lbrack {{\hat{c}}_{i - 1}{\left( {x \oplus y} \right) \oplus \Omega}} \right\rbrack},} & {{{for}\mspace{14mu} 2} \leq i \leq {k - 1}} \end{matrix} \right.$

where Ω=[2λ

(x⊕y)]⊕Ω₀ is pre-computed once and is the same for round i=1 and for all rounds iε{2, . . . , k−1}. This means that the first loop iteration is saved and three operations (one AND, one XOR and one Shift) are traded against one Shift operation. The main loop for the blinded carry addition algorithm then becomes:

/* First round iteration (i = 1) */ B ← 2Ω /* Main loop */ for i = 2 to k−1 do B ← B 

 A B ← B ⊕ Ω B ← 2B end for

It now remains to compute securely ĉ_(i) from blinded inputs {circumflex over (x)}=x⊕r_(x) and ŷ=y⊕r_(y). From a security view-point, at each step of the loop the computation of ĉ_(i) depends on the computation of Λ_(i)⊕Ω, where Λ_(i)=ĉ_(i−1)

(x⊕y). The computation of Λ_(i) and Ω can be carried out separately and in a secure way. Regarding Ω=2λ

(x⊕y)⊕Ω₀, the first part of Ω, i.e. 2λ

(x⊕y) can be securely implemented as

A=x⊕y,A=A

2λ,

and

R=r _(x) ⊕r _(y) ,R=R

2λ.

It will be appreciated that A and R cannot be XOR-ed together as this would unmask the operands. For the second part of Ω, i.e. Ω₀=(x

y)⊕λ, the calculation relies on a method proposed by Elena Trichina [see Combinational Logic Design for AES Subbyte Transformation on Masked Data. IACR Cryptology ePrint Archive, 2003:236, 2003]. Given the distributive property of the bitwise AND over the XOR, a masked version of the bitwise AND operation can be divided in four AND operations calculated pair-wise between masked data and masks (operations are done with masked data and masks independent from each other):

λ⊕x

y=λ⊕r _(x)

r ^(y) ⊕ŷ

r _(x) ⊕{circumflex over (x)}

ŷ⊕{circumflex over (x)}

r _(y)

If evaluated left-to-right, the expression does not leak any information about the operands. Interestingly, the result of the expression is randomized with λ and thus is uniformly distributed. This result can be subsequently XOR-ed with values A and R without unmasking the operands. In the present principles, Ω can then be calculated from the inputs {circumflex over (x)}, ŷ, r_(x), r_(y) and λ as follows:

1. Compute Ω₀=λ⊕x

y using the equation hereinbefore.

2. Compute Ω=Ω₀⊕A.

3. Compute Ω=Ω⊕R.

Regarding Λ=_(i)=c_(i−1)

(x⊕y) and given the Boolean masking form {circumflex over (x)}=x⊕r_(x), ŷ=y⊕r_(y), its masked version can be computed as

1. Compute {circumflex over (Λ)}_(i)=ĉ_(i−1)

({circumflex over (x)}⊕ŷ).

2. Compute r_(Λ) _(i) =ĉ_(i−1)

(r_(x)⊕r_(y)).

Similarly to A and R, the values {circumflex over (Λ)}_(i) and r_(Λ) _(i) cannot be XOR-ed together as this would unmask the operands. Hence, Ω is randomized with λ, and can then be used to securely compute ĉ_(i) as ĉ_(i)={circumflex over (Λ)}_(i)⊕Ω⊕r_(Λ) _(i) . The secure addition algorithm is illustrated in Algorithm 3:

Algorithm 3 Secure addition Input: ({circumflex over (x)}, ŷ, r_(x), r_(y)) where {circumflex over (x)} = x ⊕ r_(x) and ŷ = y ⊕ r_(y) Output: (A, R) where A = (x + y) ⊕ r_(x) ⊕ r_(y) and R = r_(x) ⊕ r_(y) /* Initialization */ 1: C ← λ (random that can be pre-generated) /* Compute Ω₀ = λ ⊕ x 

 y */ 2: T ← r_(x) 

 r_(y) 3: Ω ← T ⊕ C 4: T ← ŷ 

 r_(x) 5: Ω ← Ω ⊕ t 6: T ← {circumflex over (x)} 

 ŷ 7: Ω ← Ω ⊕ T 8: T ← {circumflex over (x)} 

 r_(y) 9: Ω ← Ω ⊕ T /* Compute Ω = Ω₀ ⊕ 2 λ 

 (x ⊕ y) */ 10: A ← {circumflex over (x)} ⊕ ŷ 11: R ← r_(x) ⊕ r_(y) 12: C ← 2C 13: T ← C 

 A 14: Ω ← Ω ⊕ T 15: T ← C 

 R 16: Ω ← Ω ⊕ T /* First round (i = 1) */ 17: D ← 2Ω /* Main loop */ 18: for i = 2 to k − 1 do 19: T ← D 

 R 20: D ← D 

 A 21: D ← D ⊕ Ω 22: D ← D ⊕ T 23: D ← 2D 24: end for /* XOR with the final carry */ 25: A ← A ⊕ D /* Remove the carry mask 2λ */ 26: A ← A ⊕ C 27: return (A, R)

From a performance point of view, Ω is pre-computed when the main loop starts as well as A={circumflex over (x)}⊕ŷ and R=r_(x)⊕r_(y). This pre-computation enables the update of ĉ_(i) inside the main loop using only two additional operations when compared to Algorithm 2 (one AND and one XOR). Algorithm 3 uses 4 additional temporary variables (C, D, T and Ω), generates one random and takes 5 k+8 operations: 2 k+6 XORs, 2 k+2 ANDS and k logical shifts.

Variant Embodiment

It will be appreciated that it can happen that one of the two operands is masked while the other is not (i.e. adding a variable 2 and a constant K). This can for example be useful with cryptographic algorithms that perform addition and subtraction with pre-defined constants. In a prior art solution, the Boolean masked input {circumflex over (x)}=x⊕r_(x) is first converted to arithmetic masked value A_(x)=x−r_(x) using 7 operations. Then the addition with the constant is performed (A_(x)+K=x−r_(x)+K, r_(x))—with an unchanged mask—and the addition result is finally converted back to a Boolean masked output ŷ=(x+K)⊕r_(x) using an Arithmetic-to-Boolean conversion algorithm. This costs 5 k+5+7+1=5 k+13 operations using Goubin's conversion methods.

The following Algorithm 4 provides a faster algorithm. The main difference to Algorithm 3 is in the initialization step where some operations can be saved as only one operand is masked.

Algorithm 4 Secure addition with one masked operand Input: ({circumflex over (x)}, K, r_(x)) where {circumflex over (x)} = x ⊕ r_(x) Output: A = (x + K) ⊕ r_(x) mod 2^(k) /* Initialization */ 1: C ← λ (random that can be pre-generated) /* Compute Ω = λ ⊕ K 

 r_(x) ⊕ {circumflex over (x)} 

 K */ 2: Ω ← K 

 r_(x) 3: Ω ← Ω ⊕ C 4: T ← {circumflex over (x)} 

 K 5: Ω ← Ω ⊕ T /* Compute Ω = Ω ⊕ 2λ 

 ({circumflex over (x)} ⊕ K) ⊕ 2λ 

 r_(x) */ 6: A ← {circumflex over (x)} ⊕ K 7: C ← 2C 8: T ← C 

 A 9: Ω ← Ω ⊕ T 10: T ← C 

 r_(x) 11: Ω ← Ω ⊕ T /* First round (i = 1)*/ 12: D ← 2Ω /* Main loop */ 13: for i = 2 to k − 1 do 14: T ← D 

 r_(x) 15: D ← D 

 A 16: D ← D ⊕ Ω 17: D ← D ⊕ T 18: D ← 2D 19: end for /* XOR with the final carry */ 20: A ← A ⊕ D /* Remove the carry mask 2λ */ 21: A ← A ⊕ C 22: return A

The main loop and the aggregation step of the algorithm remain essentially unchanged. Compared to the initialization of Algorithm 3, it will be appreciated that 5 elementary operations are saved (two ANDS and three XORs), which reduces the algorithm cost to 5 k+3 operations.

The algorithms described so far add at most two operands, but certain cryptographic algorithms require the addition of more operands. The straightforward way of adding m integers is to add the first two, then to add the resulting sum to the next integer, and so on. This would require a total of m−1 additions. As the secure addition algorithm of the present principles costs 5 k+8 operations, an addition with m blinded operands would have a huge cost; i.e. (m−1)×(5 k+8) operations, rendering it unusable in practice.

The following algorithm provides a much more efficient approach that follows the so-called “carry-save addition” technique. Loosely speaking, it consists in keeping track of the carry in a separate variable. For example, for adding three k-bit integers x, y, zε

₂ _(k) :

x+y+z=(x⊕y⊕z)+2(z

(x⊕y)⊕(x

y))(mod 2^(k)).

It will be appreciated that the addition of three integers boils down to adding two integers A and B, where

A=(x⊕y⊕z) and B=2(z

(x⊕y)⊕(x

y)).

As can be seen, expressions of A and B involve logical operations only.

The approach extends naturally to more than three integers by iteration, as illustrated in FIG. 2.

For example, four kbit integers x₁, x₂, x₃, x₄ are added using two iterations as A⁽¹⁾=(x₁⊕x₂⊕x₃), B⁽¹⁾=2(x₃

(x₁⊕x₂)⊕(x₁

x₂)), A⁽²⁾=(A⁽¹⁾⊕B⁽¹⁾⊕x₄), B⁽²⁾=2(x₄

(A⁽¹⁾⊕B⁽¹⁾)⊕(A⁽¹⁾

B⁽¹⁾)) and finally x₁+x₂+x₃+x₄=A⁽²⁾+B⁽²⁾.

More generally, m k-bit integers, x₁, x₂, . . . , x_(m)ε

₂ _(k) , are added with (m−2) evaluations of pairs (A^((i)), B^((i))), 1≦i≦m−2, and a final addition to eventually get their sum, s=Σ_(i=1) ^(m) x₁, as s=A^((m-2))+B^((m-2)).

The secure version of the carry-save addition using blinded input

,

, . . . ,

and from masks r₁, r₂, . . . , r_(m) works as follows:

1. A is securely evaluated as:

Â=Â⊕{circumflex over (B)}⊕Ĉ,R _(A) =R _(A) ⊕R _(B) ⊕R _(C).

where Â=

, R_(A)=r₁ and {circumflex over (B)}=

, R_(B)=r₂ and Ĉ=

, R_(C)=r₃

2. B is computed from Â, {circumflex over (B)}, Ĉ and from masks R_(A), R_(B), R_(C). as follows:

-   -   i) Compute {circumflex over (T)}₁=λ⊕x₁         x₂ as a secure AND using Â, {circumflex over (B)}, R_(A), R_(B)         and a random λ with Trichina's method.     -   ii) Compute {circumflex over (T)}₂=Â⊕{circumflex over (B)} and         R_(T) ₂ =R_(A)⊕R_(B).     -   iii) Compute {circumflex over (B)}=[x₃         (x₁⊕x₂)⊕(x₁         x₂)]⊕λ using {circumflex over (T)}₁, {circumflex over (T)}₂, Ĉ,         λ, R_(T) ₂ , R_(C) with a variant of Trichina's method.     -   iv) Finally set {circumflex over (B)}=2{circumflex over (B)} and         R_(B)=2λ.

This process is repeated again with Ĉ=

, R_(C)=r₄ and the new values of A, B, R_(A) and R_(B). The process is repeated (m−2) times until Ĉ=

, R_(C)=r_(m), which enables us getting the pair (A^((m-2)), B^((m-2))). Every iteration requires 22 additional operations. Therefore, the total cost of the generalized algorithm is 22(m−2)+5 k+8=22 m+5 k−36.

The addition algorithm for m blinded operands can be described as follows:

Algorithm 5 Secure binary addition with m blinded operands Input: ({circumflex over (x)}₁, ..., {circumflex over (x)}_(m), r₁, ..., r_(m)) ∈ ( 

₂ _(k) )^(2m) such that {circumflex over (x)}₁ = x₁ ⊕ r₁, ..., {circumflex over (x)}_(m) = x_(m) ⊕ r_(m) Output: (ŝ, r_(s)) where ŝ = (Σ_(i=1) ^(m) x_(i)) ⊕ r_(s) (mod 2^(k)) 1: λ ← random(2^(k)); 2: A ← {circumflex over (x)}₁; R_(A) ← r₁; B ← {circumflex over (x)}₂; R_(B) ← r₂ 3: for i = 1 to m − 2 do /* Compute Δ = λ ⊕ (A 

 B) */ 4. T ← A 

 B; D ← T ⊕ λ 5.  T ← A 

 R_(B); D ← D ⊕ T 6.  T ← R_(A) 

 B; D ← D ⊕ T 7.  T ← R_(A) 

 R_(B); D ← D ⊕ T /* Compute 2 [Δ ⊕ {circumflex over (x)}_(i+2) 

 (A ⊕ B)] */ 8.  A ← A⊕B; R_(A) ← R_(A)⊕R_(B) 9.  T ← {circumflex over (x)}_(i+2) 

 A; B ← T ⊕ D 10. T ← {circumflex over (x)}_(i+2) 

 R_(A); B ← B ⊕ T 11. T ← r_(i+2) 

 A; B ← B ⊕ T 12. T ← r_(i+2) 

 R_(A); B ← B ⊕ T 13. B ← 2B; R_(B) ← 2λ /* A ⊕ x_(i+2) */ 14. A ← A ⊕ {circumflex over (x)}_(i+2); R_(A) ← R_(A) ⊕ r_(i+2) 15. end for 16. SecureAdd(A, B, R_(A), R_(B)) using Algorithm 3

Although described for adding over numbers modulo 2^(k), the secure addition algorithm (Algorithm 3) readily extends to output the results over the integers. The algorithm can indeed accommodate operands of arbitrary length and compute their blinded sum by running it modulo 2^(k+1) for any k≧max(bit-length(x), bit-length(y))—where “bit-length” denotes the binary length.

The secure addition algorithm (Algorithm 3) can also be used for subtraction. x is used to denote the bitwise complementation of x, namely x=x⊕(−1). The secure subtraction algorithm runs in three steps:

-   -   1. Compute {circumflex over (x)};     -   2. Use Algorithm 3 on input ( {circumflex over (x)}, ŷ, r_(x),         r_(y)) and obtain (ŝ, r_(s)) where ŝ=( x+y)⊕r_(s) and         r_(s)=r_(x)+r_(y);     -   3. Set ŵ= ŝ and r_(w)=r_(s), and return (ŵ, r_(w))         where ŵ=(x−y)⊕r_(w) (mod 2^(k)) and r_(w)=r_(x)⊕r_(y).

This subtraction algorithm can also be adapted to work with more than two operands and over the integers, as described for the addition algorithm.

FIG. 1 illustrates a cryptographic device according to a preferred embodiment of the present principles. The cryptographic device 100 comprises an input unit 111 for receiving input and an output unit 113 for outputting data. The cryptographic device further comprises a hardware processor 112 configured to receive two or more input operands (one in the single-variable variant) and to perform secure modular addition according to any of the embodiments described herein.

It will thus be appreciated that a software implementation of the present principles provides modular addition algorithms that is resistant against DPA attacks. The algorithms work with modular subtraction as well and are more efficient than Goubin's method. Using same number of registers 13 elementary operations can be saved when two masked operands are used and 10 elementary operations are saved when only one masked operand is used.

For 8-bit processors the gain of the algorithm is significant as it represents a decrease of about 21.3%. It will thus be appreciated that the algorithm provides the optimal choice regarding memory versus speed complexity, which makes the algorithm attractive for resource-constraint devices.

The algorithm can be used for protecting the International Data Encryption Algorithm (IDEA) and TEA family block ciphers (TEA, XTEA, XXTEA) as well as Hash Message Authentication Code (HMAC) algorithms based on SHA-1 or SHA-2 against DPA attacks. IDEA uses 16-bit operands whereas SHA-1 or SHA-2 uses 32-bit operands. For smaller operands, one could also use our algorithm for protecting Secure And Fast Encryption Routine (SAFER). SAFER encryption uses additions modulo 28. For larger operands, the algorithm is also applicable to the SKEIN hash function or the Threefish block-cipher that work with variables of 64-bit size.

It will be appreciated that the method of the present principles is particularly suited for devices with limited resources, in particular memory that otherwise for example could be used to store lookup tables.

Each feature disclosed in the description and (where appropriate) the claims and drawings may be provided independently or in any appropriate combination. Features described as being implemented in hardware may also be implemented in software, and vice versa. Reference numerals appearing in the claims are by way of illustration only and shall have no limiting effect on the scope of the claims. 

1. A method of performing modular addition between a first integer value x and a second integer value y, the method comprising, in a hardware processor: obtaining a first masked input {circumflex over (x)}, a second masked input ŷ, a first mask r_(x) and a second mask r_(y), the first masked input {circumflex over (x)} resulting from the first integer value x masked by the first mask r_(x) and the second masked input ŷ resulting from the second integer value y masked by the second mask r_(y); computing a first iteration carry value c₁, using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r_(x), the second mask r_(y); recursively updating intermediate carry values c_(i) to obtain a final carry value c_(k−1, wherein an intermediate carry value is updated using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r) _(x) and the second mask r_(y); combining the first masked input {circumflex over (x)} and the second masked input ŷ and the final carry value c_(k−1) to obtain a masked result; and outputting the masked result.
 2. The method of claim 1, wherein the first iteration carry value, the intermediate carry values and the final carry value are masked and: the first iteration carry value c₁ is computed using also a carry mask value λ; and the intermediate carry values c_(i) are updated using also the carry mask value λ; and wherein the masked result is obtained by: combining the first masked input {circumflex over (x)} and the second masked input ŷ and the final masked carry value to obtain an intermediate value; and combining the intermediate value with the carry mask value to obtain a masked result.
 3. The method of claim 2, wherein the intermediate value and the masked result are obtained using XOR between the combined values.
 4. The method of claim 2, further comprising outputting a combination of the first mask r_(x) and the second mask r_(y).
 5. The method of claim 4, wherein the combination of the first mask r_(x) and the second mask r_(y) is obtained using XOR.
 6. The method of claim 1, wherein the modular addition is used to subtract the second integer value y from the first integer value x, the method further comprising: between the obtaining and the computing, setting the first masked input {circumflex over (x)} to the bitwise complementation of the first masked input {circumflex over (x)}; and between the combining and the outputting, setting the masked result to the bitwise complementation of the masked result.
 7. A method of performing modular addition between n integer values x₁ . . . x_(n), wherein n≧3, the method comprising, in a hardware processor: obtaining n masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and n masks r₁ . . . r_(n), wherein each masked input {circumflex over (x)}_(i) results from a combination between an integer value x_(i) and a corresponding mask r_(i); generating a first intermediate couple of a masked value and a mask (A₁, R_(A1)) using masked inputs {circumflex over (x)}₁, {circumflex over (x)}₂, {circumflex over (x)}₃ and the corresponding masks r₁, r₂, r₃; generating a second intermediate couple of masked value and a mask (B₁, R_(B1)) using masked inputs {circumflex over (x)}₁, {circumflex over (x)}₂, {circumflex over (x)}₃ and the corresponding masks r₁, r₂, r₃; if n>3, performing n−3 iterations, where k is a present iteration, of: computing a k-th first intermediate couple of a masked value and a mask (A_(k), R_(Ak)), using the first intermediate couple of a masked value and a (A_(k−1), R_(Ak−1)) the second intermediate couple of a masked value and a mask (B_(k−1), R_(Bk−1)), and a masked input and a mask ({circumflex over (x)}_(k+3), r_(k+3)); and computing a k-th first intermediate couple of a masked value and a mask (B_(k), R_(Bk)), using the first intermediate couple of a masked value and a mask (A_(k−1), R_(Ak−1)) the second intermediate couple of a masked value and a mask (B_(k−1), R_(Bk−1)), and a couple of input ({circumflex over (x)}_(k+3), r_(k+3)); and performing a modular addition between the first intermediate couple value (A_(k), R_(Ak)), and the second intermediate couple values (B_(k), R_(Bk)), to obtain a masked result; and outputting the masked result.
 8. The method of claim 7, wherein: the intermediate masked values A₁, . . . , A_(k) are a combination of masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) in and the combinations are obtained using a XOR between the input values, and where the masks R_(A1), . . . , R_(Ak) are random or a combination of masks r₁ . . . r_(n), and where the combinations are obtained using XOR between the mask values; and the intermediate masked values B₁, . . . , B_(k) are combinations of masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and the combinations are obtained using a XOR and an AND between the input values and where the masks R_(B1), . . . , R_(Bk) are random or combinations of masks r₁ . . . r_(n), and the combinations are obtained using a XOR between the mask values.
 9. A device for performing modular addition between a first integer value x and a second integer value y, the device comprising a hardware processor configured to: obtain a first masked input {circumflex over (x)}, a second masked input ŷ, a first mask r_(x) and a second mask r_(y), the first masked input {circumflex over (x)} resulting from the first integer value x masked by the first mask r_(x) and the second masked input ŷ resulting from the second integer value y masked by the second mask r_(y); compute a first iteration carry value c₁, using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r_(x), the second mask r_(y); recursively update intermediate carry values c_(i) to obtain a final carry value c_(k−1), wherein an intermediate carry value is updated using the first masked input {circumflex over (x)}, the second masked input ŷ, the first mask r_(x) and the second mask r_(y); combine the first masked input {circumflex over (x)} and the second masked input ŷ and the final carry value c_(k−1) to obtain a masked result; and output the masked result.
 10. The device of claim 9, wherein the first iteration carry value, the intermediate carry values and the final carry value are masked and the hardware processor is configured to: compute the first iteration carry value c₁ using also a carry mask value λ; and update the intermediate carry values c_(i) using also the carry mask value λ; and wherein the hardware processor is configured to combine the first masked input {circumflex over (x)} and the second masked input ŷ and the final masked carry value to obtain an intermediate value, and to combine the intermediate value with the carry mask value to obtain the masked result.
 11. The device of claim 10, wherein the intermediate value and the hardware processor is configured to use XOR between the combined values to obtain the masked result.
 12. The device of claim 10, wherein the hardware processor is further configured to output a combination of the first mask r_(x) and the second mask r_(y).
 13. The device of claim 9, wherein the hardware processor is configured to use the modular addition to subtract the second integer value y from the first integer value x, the hardware processor being further configured to: set the first masked input {circumflex over (x)} to the bitwise complementation of the first masked input {circumflex over (x)}; and set the masked result to the bitwise complementation of the masked result.
 14. A device for performing modular addition between n integer values x₁ . . . x_(n), wherein n≧3, the device comprising a hardware processor configured to: obtain n masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and n masks r₁ . . . r_(n), wherein each masked input {circumflex over (x)}_(i) results from a combination between an integer value x_(i) and a corresponding mask r_(i); generate a first intermediate couple of masked and mask values (A₁, R_(A1)) using masked inputs {circumflex over (x)}₁, {circumflex over (x)}₂, {circumflex over (x)}₃ and the corresponding masks r₁, r₂, r₃; generate a second intermediate couple of masked and mask values (B₁, R_(B1)) using masked inputs {circumflex over (x)}₁, {circumflex over (x)}₂, {circumflex over (x)}₃ and the corresponding masks r_(i), r₂, r₃; if n>3, perform n−3 iterations, where k is a present iteration, of: computing a k-th first intermediate couple of masked and mask values (A_(k), R_(Ak)), using the first intermediate couple of masked and mask values (A_(k−1), R_(Ak−1)) the second intermediate couple of masked and mask values (B_(k−1), R_(Bk−1)), and a couple of input ({circumflex over (x)}_(k+3), r_(k+3)); and computing a k-th first intermediate couple of masked and mask values (B_(k), R_(Bk)), using the first intermediate couple of masked and mask values (A_(k−1), R_(Ak−1)) the second intermediate couple of masked and mask values (B_(k−1), R_(Bk−1)), and a couple of input ({circumflex over (x)}_(k+3), r_(k+3)); and perform a modular addition between the first intermediate couple value (A_(k), R_(Ak)), and the second intermediate couple values (B_(k), R_(Bk)), to obtain a masked result; and output the masked result.
 15. The device of claim 14, wherein the intermediate masked values A₁, . . . , A_(k) are a combination of masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and the combinations are obtained using a XOR between the input values, and where mask values R_(A1), . . . , R_(Ak) are random or a combination of masks r₁ . . . r_(n), and where the combinations are obtained using XOR between the mask values; and the intermediate masked value B₁, . . . , B_(k) are combinations of masked inputs {circumflex over (x)}₁ . . . {circumflex over (x)}_(n) and the combinations are obtained using a XOR and an AND between the input values and where the mask values R_(B1), . . . , R_(Bk) are random or combinations of masks r₁ . . . r_(n), and the combinations are obtained using a XOR between the mask values. 